既然都有夾娃娃機的效果了,就來蓋個夾娃娃機台吧,今天先建立機台的剛體
建立機台夾層地板剛體與網格
let machineBottom = new CANNON.Box(new CANNON.Vec3(3.5, 0.1, 3))
let machineBottomMaterial = new CANNON.Material()
machineBottomBody = new CANNON.Body({
shape: machineBottom,
position: new CANNON.Vec3(-0.5, 4.5, 0),
material: machineBottomMaterial,
})
world.add(machineBottomBody)
// 機台夾層地板網格
const machineBottomGeo = new THREE.BoxGeometry(6.8, 0.2, 6);
const machineBottomMat = new THREE.MeshPhongMaterial({
color: 0x000000,
});
machine = new THREE.Mesh(machineBottomGeo, machineBottomMat);
machine.castShadow = true
scene.add(machine);
建立右邊牆壁剛體與網格
// 右牆壁剛體
let wallshape = new CANNON.Box(new CANNON.Vec3(0.1, 2.7, 3))
let wallMaterial = new CANNON.Material()
wallBody = new CANNON.Body({
shape: wallshape,
position: new CANNON.Vec3(3, 7.2, 0),
material: wallMaterial,
})
world.add(wallBody)
// 右牆壁網格
const wallGeo = new THREE.BoxGeometry(0.2, 5.4, 6);
const wallMat = new THREE.MeshPhongMaterial({
color: 0x4287f5,
});
wall = new THREE.Mesh(wallGeo, wallMat);
wall.castShadow = true
scene.add(wall);
建立左邊牆壁剛體與網格
let wallLshape = new CANNON.Box(new CANNON.Vec3(0.1, 4.5, 3))
let wallLMaterial = new CANNON.Material()
wallLBody = new CANNON.Body({
shape: wallLshape,
position: new CANNON.Vec3(-7.5, 5.4, 0),
material: wallLMaterial,
})
world.add(wallLBody)
// 左牆壁網格
const wallLGeo = new THREE.BoxGeometry(0.2, 9, 6);
const wallLMat = new THREE.MeshPhongMaterial({
color: 0x4287f5,
});
wallL = new THREE.Mesh(wallLGeo, wallLMat);
wallL.castShadow = true
scene.add(wallL);
建立檔板剛體與網格
let swallshape = new CANNON.Box(new CANNON.Vec3(0.1, 2.5, 3))
let swallMaterial = new CANNON.Material()
swallBody = new CANNON.Body({
shape: swallshape,
position: new CANNON.Vec3(-4, 3.4, 0),
material: swallMaterial,
})
world.add(swallBody)
//檔板網格
const swallGeo = new THREE.BoxGeometry(0.2, 5, 6);
const swallMat = new THREE.MeshPhongMaterial({
color: 0x4287f5,
});
swall = new THREE.Mesh(swallGeo, swallMat);
swall.castShadow = true
scene.add(swall);
建立掉落物地板剛體與網格
let floorshape = new CANNON.Box(new CANNON.Vec3(1.8, 0.1, 3))
let floorMaterial = new CANNON.Material()
floorBody = new CANNON.Body({
shape: floorshape,
position: new CANNON.Vec3(-5.8, 1, 0),
material: floorMaterial,
})
world.add(floorBody)
//掉落物地板網格
const floorGeo = new THREE.BoxGeometry(3.6, 0.2, 6);
const floorMat = new THREE.MeshPhongMaterial({
color: 0x4287f5,
});
floor = new THREE.Mesh(floorGeo, floorMat);
floor.castShadow = true
scene.add(floor);
建立背板剛體與網格
let backwallshape = new CANNON.Box(new CANNON.Vec3(5.2, 2.8, 0.1))
let backwallMaterial = new CANNON.Material()
backwallBody = new CANNON.Body({
shape: backwallshape,
position: new CANNON.Vec3(-2.2, 7.1, -3),
material: backwallMaterial,
})
world.add(backwallBody)
// 背板網格
const backwallGeo = new THREE.BoxGeometry(10.5, 5.6, 0.2);
const backwallMat = new THREE.MeshPhongMaterial({
color: 0x1C4265,
});
backwall = new THREE.Mesh(backwallGeo, backwallMat);
backwall.castShadow = true
scene.add(backwall);
建立前方玻璃剛體與網格
let frontwallshape = new CANNON.Box(new CANNON.Vec3(5.2, 2.8, 0.1))
let frontwallMaterial = new CANNON.Material()
frontwallBody = new CANNON.Body({
shape: frontwallshape,
position: new CANNON.Vec3(-2.2, 7.1, 3),
material: frontwallMaterial,
})
world.add(frontwallBody)
// 前玻璃網格
const frontwallGeo = new THREE.BoxGeometry(10.5, 5.6, 0.2);
const frontwallMat = new THREE.MeshPhongMaterial({
color: 0x1C4265,
transparent:true,
opacity:0.3,
});
frontwall = new THREE.Mesh(frontwallGeo, frontwallMat);
frontwall.castShadow = true
scene.add(frontwall);
建立 function 複製剛體位置至網格位置
function wall_load() {
// 機台
machine.position.copy(machineBottomBody.position)
machine.quaternion.copy(machineBottomBody.quaternion)
wall.position.copy(wallBody.position)
wall.quaternion.copy(wallBody.quaternion)
wallL.position.copy(wallLBody.position)
wallL.quaternion.copy(wallLBody.quaternion)
floor.position.copy(floorBody.position)
floor.quaternion.copy(floorBody.quaternion)
swall.position.copy(swallBody.position)
swall.quaternion.copy(swallBody.quaternion)
backwall.position.copy(backwallBody.position)
backwall.quaternion.copy(backwallBody.quaternion)
frontwall.position.copy(frontwallBody.position)
frontwall.quaternion.copy(frontwallBody.quaternion)
}
在 render() 處呼叫 function 一次渲染機台剛體位置
requestAnimationFrame(wall_load)
機台剛體
Day23 Demo | Github